package com.itheima.set;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/*
Set集合：
    元素不能重复，无索引，没存储的顺序（存取顺序不保证一致）
    TreeSet
        元素不能重复，无索引，元素按照规则排序
        添加到集合中的元素进行排序
        排序规则：
            自然排序
                元素所属的类实现Comparable<T>,实现compareTo方法
                根据compareTo的返回值
                    负数向左排
                    正数向右排
                    0则表示相同移除
            比较器排序
                使用public TreeSet(Comparator<? super E> comparator)构造，传递Comparator接口的实现类对象
                    重写compare方法，根据方法的返回值
                        返回正数，向右存
                        返回负数，向左存
                        返回0，不存
            两种比较原则都有，比较器顺序优先
    HashSet
 */
public class SetDemo {
    public static void main(String[] args) {
        //Set集合的基本使用
        /*Set<String> set = new TreeSet<>();
        set.add("ccc");
        set.add("aaa");
        set.add("bbb");
        set.add("aaa");
        set.add("ccc");
        System.out.println(set);*/
        //TreeSet
        //基础示例
        /*TreeSet<Integer> ts = new TreeSet<>();
        ts.add(5);
        ts.add(3);
        ts.add(4);
        ts.add(1);
        ts.add(2);
        System.out.println(ts);*/
        //TreeSet的自然排序
        /*TreeSet<String> set = new TreeSet<>();
        //字符串的自然排序 按照字典顺序排序，完全相同就移除不要了
        set.add("aaa");
        set.add("bbb");
        set.add("ccc");
        set.add("abc");
        set.add("aaa");
        System.out.println(set);*/
        //Student类按年龄从小到大排序（主）,字符串姓名按照字典顺序排（次）
        /*TreeSet<Student> set = new TreeSet<>();
        Student s1 = new Student("zhangsan",25);
        Student s2 = new Student("lisi",24);
        Student s3 = new Student("wangwu",23);
        Student s4 = new Student("zhangliu",25);
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        for (Student s : set) {
            System.out.println(s);
        }
        System.out.println(set);*/
        //比较器Comparator排序，传递Comparator的实现类对象，重写compare方法 pre：之前的
        /* TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher t, Teacher pret) {
                //主要条件
                int result = t.getAge() - pret.getAge();
                //次要条件
                result = result == 0 ? t.getName().compareTo(pret.getName()) : result;
                return result;
            }
        });*/
        //lambda表达式比较器排序，pre:以前的
        /*TreeSet<Teacher> ts = new TreeSet<>((t, pret) -> {
            //主要条件
            int result = t.getAge() - pret.getAge();
            //次要条件
            result = result == 0 ? t.getName().compareTo(pret.getName()) : result;
            return result;
        });
        Teacher t1 = new Teacher("lv", 18);
        Teacher t2 = new Teacher("zhao", 17);
        Teacher t3 = new Teacher("dian", 18);
        ts.add(t1);
        ts.add(t2);
        ts.add(t3);
        for (Teacher t : ts) {
            System.out.println(t);
        }
        System.out.println(ts);*/
        //字符串长短排序
        /*TreeSet<String> ts = new TreeSet<>((o1, o2) -> {
            int result = o1.length() - o2.length();
            result = result == 0 ? o1.compareTo(o2) : result;
            return result;
        });
        ts.add("c");
        ts.add("ab");
        ts.add("cf");
        ts.add("qwer");
        for (String t : ts) {
            System.out.println(t);
        }
        System.out.println(ts);*/
    }
}

class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student pre) {
        //排序规则
        //this当前添加的元素
        //pre已经存入的元素
        //主要条件
        int result = this.age - pre.age;//年龄从小到大
        // int result = pre.age-this.age;从大到小
        //次要条件
        result = result == 0 ? this.name.compareTo(pre.getName()) : result;//判断姓名（字符串）按照字典排序
        //所有成员变量都相等，返回0
        //如果需要添加重复元素result = result == 0 ? 1:result;
        return result;
    }
}

class Teacher {
    private String name;
    private int age;

    public Teacher() {
    }

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
